#include "ModRunFacade.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Facade/FacadeTea.h"
#include "Gof23/Gof_Facade/Tea.h"
#include "Gof23/Gof_Facade/Water.h"
#include "Gof23/Gof_Facade/TeaSet.h"

//外观模式的ModRun（Facade）;
ModRunFacade::ModRunFacade()
{
    //模式名称;
    m_strModelName = "外观模式（Facade）;";
    //模式描述;
    m_strModelDesc = "外观模式又叫作门面模式，是一种通过为多个复杂的子系统提供一个一致的接口，而使这些子系统更加容易被访问的模式。\n"
                     "该模式对外有一个统一接口，外部应用程序不用关心内部子系统的具体细节，这样会大大降低应用程序的复杂度，\n"
                     "提高了程序的可维护性。\n\n"
                     "一般客户端按照一定流程访问对个对象后，得到一个结果时，则封装此多个对象，提供一个统一接口给客户端，使其可以忽略流程，直接拿到结果";
}

//初始化显示模式;
void ModRunFacade::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunFacade::GetEnum()
{
    return emModRunFacade;
}

//运行模式;
void ModRunFacade::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========外观模式 start:=======" };
        std::initializer_list<QString> outListSb{ "==============================" };
        std::initializer_list<QString> outListEnd{ "========外观模式 end:=======" };

        std::initializer_list<QString> outListTea{ "获得一杯茶" };
        pOutPut->OutPut(outListStart);

        //外观模式（Facade）;
        //普通泡茶;
        Water water;
        water.shaoWater();
        Tea tea;
        tea.paoWater();
        TeaSet teaset;
        teaset.OneTea();

        pOutPut->OutPut(outListTea);
        pOutPut->OutPut(outListSb);

        FacadeTea FacadeTea;
        FacadeTea.HaveTea();
        
        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunFacade::CreateMe()
{
    return new ModRunFacade();
}
